{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 189,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "from sklearn.metrics import log_loss  \n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 190,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 190,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "dpath = './'\n",
    "train = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 191,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 192,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 192,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将类别字符串变成数字\n",
    "# drop ids and get labels\n",
    "y = train['Outcome'].values\n",
    "X = train.drop(\"Outcome\", axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.训练数据和测试数据分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>2</td>\n",
       "      <td>110</td>\n",
       "      <td>74</td>\n",
       "      <td>29</td>\n",
       "      <td>125</td>\n",
       "      <td>32.4</td>\n",
       "      <td>0.698</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>339</th>\n",
       "      <td>7</td>\n",
       "      <td>178</td>\n",
       "      <td>84</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>39.9</td>\n",
       "      <td>0.331</td>\n",
       "      <td>41</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>414</th>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>60</td>\n",
       "      <td>35</td>\n",
       "      <td>167</td>\n",
       "      <td>34.6</td>\n",
       "      <td>0.534</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>9</td>\n",
       "      <td>102</td>\n",
       "      <td>76</td>\n",
       "      <td>37</td>\n",
       "      <td>0</td>\n",
       "      <td>32.9</td>\n",
       "      <td>0.665</td>\n",
       "      <td>46</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>259</th>\n",
       "      <td>11</td>\n",
       "      <td>155</td>\n",
       "      <td>76</td>\n",
       "      <td>28</td>\n",
       "      <td>150</td>\n",
       "      <td>33.3</td>\n",
       "      <td>1.353</td>\n",
       "      <td>51</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "85             2      110             74             29      125  32.4   \n",
       "339            7      178             84              0        0  39.9   \n",
       "414            0      138             60             35      167  34.6   \n",
       "37             9      102             76             37        0  32.9   \n",
       "259           11      155             76             28      150  33.3   \n",
       "\n",
       "     DiabetesPedigreeFunction  Age  \n",
       "85                      0.698   27  \n",
       "339                     0.331   41  \n",
       "414                     0.534   21  \n",
       "37                      0.665   46  \n",
       "259                     1.353   51  "
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练样本,用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 33, test_size=0.2)\n",
    "X_train.shape\n",
    "X_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "ss_y = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n",
    "\n",
    "# #对y标准化的好处是不同问题的w差异不太大，同时正则参数的范围也有限\n",
    "# y_train = ss_y.fit_transform(y_train.reshape(-1, 1))\n",
    "# y_test = ss_y.transform(y_test.reshape(-1, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss is of each fold is [0.46129644 0.46510588 0.56426612 0.44377717 0.46617809]\n",
      "cv logloss is: -0.48012474004701106\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "lx = LogisticRegression()\n",
    "\n",
    "from sklearn.cross_validation import cross_val_score\n",
    "loss = cross_val_score(lx, X_train, y_train, cv = 5, scoring = 'neg_log_loss')\n",
    "\n",
    "print('logloss is of each fold is', -loss)\n",
    "print('cv logloss is:', loss.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Logistic 回归，并选择最佳的正则函数(L1/L2)及正则参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 197,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "#需要调优的参数\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression()\n",
    "grid = GridSearchCV(lr_penalty, tuned_parameters, cv = 5, scoring = 'neg_log_loss')\n",
    "grid.fit(X_test, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00072079, 0.0005331 , 0.00044241, 0.00071449, 0.00101962,\n",
       "        0.00078945, 0.00057049, 0.00058985, 0.00047679, 0.00048313,\n",
       "        0.00049753, 0.00052013, 0.00047665, 0.00047698]),\n",
       " 'std_fit_time': array([4.73848403e-04, 6.14589270e-05, 1.44416335e-05, 2.15868421e-04,\n",
       "        2.43585372e-04, 3.23491768e-04, 1.25878092e-04, 7.97680301e-05,\n",
       "        1.82718872e-05, 3.59642711e-05, 1.90826632e-05, 4.77617579e-05,\n",
       "        1.17057452e-05, 2.94925228e-05]),\n",
       " 'mean_score_time': array([0.00096078, 0.00071802, 0.00069895, 0.00143142, 0.00146084,\n",
       "        0.00135698, 0.00072255, 0.00085268, 0.00060816, 0.00062141,\n",
       "        0.00063133, 0.00065641, 0.00060101, 0.00060916]),\n",
       " 'std_score_time': array([3.45420831e-04, 2.12631949e-05, 2.05530644e-05, 9.63717712e-04,\n",
       "        3.63179020e-04, 5.28132588e-04, 1.66150663e-04, 3.53887665e-04,\n",
       "        1.52538709e-05, 3.19511498e-05, 2.75313074e-05, 9.44137573e-06,\n",
       "        2.54739960e-06, 1.57659412e-05]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 100,\n",
       "                    100, 1000, 1000],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'},\n",
       "  {'C': 1000, 'penalty': 'l1'},\n",
       "  {'C': 1000, 'penalty': 'l2'}],\n",
       " 'split0_test_score': array([-0.69314718, -0.68370519, -0.69314718, -0.62835287, -0.5990731 ,\n",
       "        -0.54193249, -0.5537933 , -0.54529028, -0.55842569, -0.55752704,\n",
       "        -0.55944065, -0.55936443, -0.55952859, -0.55955684]),\n",
       " 'split1_test_score': array([-0.69314718, -0.6820914 , -0.69314718, -0.61254974, -0.57787559,\n",
       "        -0.47843794, -0.46080638, -0.46234603, -0.46913932, -0.47008952,\n",
       "        -0.47117257, -0.47128083, -0.47138122, -0.47140549]),\n",
       " 'split2_test_score': array([-0.69314718, -0.6847744 , -0.69314718, -0.63602427, -0.62013174,\n",
       "        -0.56455964, -0.5792556 , -0.58042226, -0.59349336, -0.5937835 ,\n",
       "        -0.59560359, -0.59563399, -0.59582521, -0.59582582]),\n",
       " 'split3_test_score': array([-0.69314718, -0.68463622, -0.69314718, -0.63608957, -0.67326611,\n",
       "        -0.58095304, -0.62870517, -0.61542609, -0.63589156, -0.63462838,\n",
       "        -0.63741266, -0.63727773, -0.63756611, -0.63755284]),\n",
       " 'split4_test_score': array([-0.69314718, -0.68689231, -0.69314718, -0.65469204, -0.62709502,\n",
       "        -0.65280192, -0.73203077, -0.74909739, -0.7865108 , -0.78911329,\n",
       "        -0.79422322, -0.79449646, -0.79500736, -0.7950541 ]),\n",
       " 'mean_test_score': array([-0.69314718, -0.68440385, -0.69314718, -0.63340436, -0.61943892,\n",
       "        -0.56315866, -0.59000193, -0.58948667, -0.60753748, -0.60785896,\n",
       "        -0.61038448, -0.61042312, -0.61067244, -0.61068957]),\n",
       " 'std_test_score': array([4.90016266e-17, 1.55547883e-03, 4.90016266e-17, 1.35571612e-02,\n",
       "        3.20310634e-02, 5.62592992e-02, 8.87598936e-02, 9.36050322e-02,\n",
       "        1.03839505e-01, 1.04473808e-01, 1.05822429e-01, 1.05885902e-01,\n",
       "        1.06025778e-01, 1.06031755e-01]),\n",
       " 'rank_test_score': array([13, 12, 13, 11, 10,  1,  3,  2,  4,  5,  6,  7,  8,  9],\n",
       "       dtype=int32),\n",
       " 'split0_train_score': array([-0.69314718, -0.68214804, -0.69314718, -0.61705369, -0.58155461,\n",
       "        -0.50785861, -0.48219877, -0.48032721, -0.47909812, -0.47907877,\n",
       "        -0.47906127, -0.47906108, -0.47906089, -0.47906089]),\n",
       " 'split1_train_score': array([-0.69314718, -0.68396024, -0.69314718, -0.62950295, -0.61647124,\n",
       "        -0.53247407, -0.50809723, -0.50620443, -0.50511065, -0.50508349,\n",
       "        -0.50506869, -0.5050684 , -0.50506825, -0.50506824]),\n",
       " 'split2_train_score': array([-0.69314718, -0.68197068, -0.69314718, -0.61680815, -0.58232879,\n",
       "        -0.5082796 , -0.48231463, -0.48030525, -0.47910988, -0.47908869,\n",
       "        -0.47907213, -0.47907192, -0.47907175, -0.47907175]),\n",
       " 'split3_train_score': array([-0.69314718, -0.68202823, -0.69314718, -0.61482906, -0.5557725 ,\n",
       "        -0.49341191, -0.46092726, -0.45902932, -0.45736491, -0.45734736,\n",
       "        -0.45732324, -0.45732307, -0.45732281, -0.45732281]),\n",
       " 'split4_train_score': array([-0.69314718, -0.68021415, -0.69314718, -0.60373709, -0.55881294,\n",
       "        -0.47097037, -0.43514929, -0.43319801, -0.43133557, -0.43130939,\n",
       "        -0.43128223, -0.43128194, -0.43128165, -0.43128165]),\n",
       " 'mean_train_score': array([-0.69314718, -0.68206427, -0.69314718, -0.61638619, -0.57898802,\n",
       "        -0.50259891, -0.47373743, -0.47181284, -0.47040383, -0.47038154,\n",
       "        -0.47036151, -0.47036128, -0.47036107, -0.47036107]),\n",
       " 'std_train_score': array([0.        , 0.00118615, 0.        , 0.00818654, 0.02176573,\n",
       "        0.02018527, 0.02440862, 0.02442098, 0.02470746, 0.0247071 ,\n",
       "        0.02471168, 0.02471168, 0.02471173, 0.02471173])}"
      ]
     },
     "execution_count": 198,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.5631586625530235\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# 最佳参数\n",
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.线性 SVM，并选择最佳正则参数，比较与 Logistic 回归的性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC(C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7272727272727273\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.7402597402597403\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_test, y_test)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### C = 1时，准确率最高"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. RBF 核的 SVM，并选择最佳的超参数(正则参数、RBF 核函数宽度);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC\n",
    "\n",
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7077922077922078\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.7402597402597403\n",
      "accuracy: 0.7077922077922078\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7532467532467533\n",
      "accuracy: 0.7272727272727273\n",
      "accuracy: 0.6883116883116883\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.7467532467532467\n",
      "accuracy: 0.6623376623376623\n",
      "accuracy: 0.6883116883116883\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最大值： 0.7532467532467533\n"
     ]
    }
   ],
   "source": [
    "print(\"最大值：\", max(accuracy_s))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "gamma越大，RBF核参数sigma越小，决策边界越复杂，可以调小gamma"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6493506493506493\n",
      "accuracy: 0.7337662337662337\n",
      "accuracy: 0.6428571428571429\n",
      "accuracy: 0.6493506493506493\n",
      "accuracy: 0.7272727272727273\n",
      "accuracy: 0.7532467532467533\n",
      "accuracy: 0.6493506493506493\n",
      "accuracy: 0.7272727272727273\n",
      "accuracy: 0.7597402597402597\n",
      "accuracy: 0.7467532467532467\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, -2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最大值： 0.7597402597402597\n"
     ]
    }
   ],
   "source": [
    "print(\"最大值：\", max(accuracy_s))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
